gsk: Use clip defines in shaders
authorMatthias Clasen <mclasen@redhat.com>
Sun, 7 Mar 2021 22:51:42 +0000 (17:51 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 8 Mar 2021 01:30:45 +0000 (20:30 -0500)
Use the NO_CLIP and RECT_CLIP defines to make
simpler shaders for these cases.

Note: This does not work yet.

gsk/resources/glsl/preamble.fs.glsl
gsk/resources/glsl/preamble.glsl

index c2cd1cdc29ccab5cfd14356cea58e0898055670b..cd0af69958a911cd625b768697650585dc8cfde8 100644 (file)
@@ -75,6 +75,16 @@ gsk_rounded_rect_coverage (GskRoundedRect r, vec2 p)
   return 1.0 - dot(vec4(is_out), corner_coverages);
 }
 
+float
+gsk_rect_coverage (vec4 r, vec2 p)
+{
+  if (p.x < r.x || p.y < r.y ||
+      p.x >= r.z || p.y >= r.w)
+    return 0.0;
+
+  return 1.0;
+}
+
 vec4 GskTexture(sampler2D sampler, vec2 texCoords) {
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
   return texture2D(sampler, texCoords);
@@ -101,14 +111,21 @@ vec2 gsk_get_frag_coord() {
 }
 
 void gskSetOutputColor(vec4 color) {
-  vec2 f = gsk_get_frag_coord();
+  vec4 result;
+
+#if defined(NO_CLIP)
+  result = color;
+#elif defined(RECT_CLIP)
+  result = color * gsk_rect_coverage(gsk_get_bounds(u_clip_rect),
+                                     gsk_get_frag_coord());
+#else
+  result = color * gsk_rounded_rect_coverage(gsk_create_rect(u_clip_rect),
+                                             gsk_get_frag_coord());
+#endif
 
-  // We do *NOT* transform the clip rect here since we already
-  // need to do that on the CPU.
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
-  gl_FragColor = color * gsk_rounded_rect_coverage(gsk_create_rect(u_clip_rect), f);
+  gl_FragColor = result;
 #else
-  outputColor = color * gsk_rounded_rect_coverage(gsk_create_rect(u_clip_rect), f);
+  outputColor = result;
 #endif
-  /*outputColor = color;*/
 }
index 8ca6469f6dab395a38f2fcc6fb4a0ca494ccdb3c..8bc007ba67685a17e90d451496fb6cb779e3d7e7 100644 (file)
@@ -38,6 +38,12 @@ gsk_create_rect(vec4[3] data)
   return GskRoundedRect(bounds, corner_points1, corner_points2);
 }
 
+vec4
+gsk_get_bounds(vec4[3] data)
+{
+  return vec4(data[0].xy, data[0].xy + data[0].zw);
+}
+
 vec4 gsk_premultiply(vec4 c) {
   return vec4(c.rgb * c.a, c.a);
 }